{
  Определение внутренних типов данных

 TinlID - Тип для локального идентификатора
 TinlUID - Тип для глобального уникального идентификатора
 TinlHash - Тип для хэша элемента
 TinlModifctn - Тип для описания версии изменения объекта
 TinlTimeStamp - Время последнего изменения объекта
 TinlNameType - Тип для имен объектов
 TinlLongNameType - Тип для полных названий
 TinlStringType - Тип для строковых величин
 TinlRubricType - Тип для раздела описания

   версия 0.2 март 2011 prodg@ya.ru D.Kondakov
}
unit IIntgrlTypes;

{$mode objfpc}{$H+}

interface

{$I calcconfig.inc}

uses
  Classes, SysUtils;

type
  TinlID = Integer;
  TinlUID = LongInt;
  TinlHash = LongInt;
  TinlModifctn = Integer;
  TinlTimeStamp = TTimeStamp; // милисекунд дня + дней от РХ  (1 314 000 секунд в году)

  TIntgrlDataTrust = Real;
  TIntgrlDataNeed = Real;

// Внутренние типы данных
  TinlNameType = String;
  TinlLongNameType = String;
  TinlStringType = String;
  TinlFloatType = Double;
  TinlLogicType = Boolean;
  TinlIntegerType = LongInt;

  TinlRubricType = PChar;

const
  noID = -1;

  iddUndefined: TIntgrlDataTrust = -1.0;
  iddFalse: TIntgrlDataTrust = 0.0;
  iddWrong: TIntgrlDataTrust = 0.1;
  iddInaccurate: TIntgrlDataTrust = 0.3;
  iddExact: TIntgrlDataTrust = 0.5;
  iddCorrect: TIntgrlDataTrust = 0.7;
  iddPrecise: TIntgrlDataTrust = 0.9;
  iddTrue: TIntgrlDataTrust = 1.0;

  idnUnnecessary: TIntgrlDataNeed = -1.0;
  idnUseless: TIntgrlDataNeed = 0.0;
  idnOptional: TIntgrlDataNeed = 0.1;
  idnInsignificant: TIntgrlDataNeed = 0.3;
  idnNeed: TIntgrlDataNeed = 0.5;
  idnImportant: TIntgrlDataNeed = 0.7;
  idnRequired: TIntgrlDataNeed = 0.9;
  idnCritical: TIntgrlDataNeed = 1.0;

// Определение строковых констант
  sTrue = 'true';
  sFalse = 'false';
  sOn = 'on';
  sOff = 'off';
  sYes = 'yes';
  sNo = 'no';
  sEnabled = 'enabled';
  sDisabled = 'disabled';

  b = ' ';
  b2 = '  ';
  b3 = '   ';
  tb = #9;
  eq = '=';
  TinlNameRestrChars: set of char = [#0, b, tb, #10, #13, '.', ',', eq, '+', '-', '*', '/', '^'];

  function v2s(v: TinlModifctn): TinlStringType; inline;
  function s2n(s: TinlStringType): TinlNameType; inline;

  function b2s(b: TinlLogicType): TinlStringType; inline;
  function i2s(i: TinlIntegerType): TinlStringType; inline;
  function h2s(i: TinlIntegerType): TinlStringType; inline;
  function r2s(r: TinlFloatType): TinlStringType; inline;
  function i2b(i: TinlIntegerType): TinlLogicType; inline;
  function r2b(r: TinlFloatType): TinlLogicType; inline;
  function s2b(s: TinlStringType): TinlLogicType; inline;
  function int2idx(i: TinlIntegerType): TinlID; inline;

  function vldName(n: TinlNameType): TinlLogicType; inline;

implementation

function v2s(v: TinlModifctn): TinlStringType;
var
  ver, maj, min, bld: integer;
begin
  ver := v div 10000000000;
   bld := v - ver*10000000000;
  maj := bld div 100000000;
   bld := bld - maj*100000000;
  min := bld div 1000000;
  bld := bld - min*1000000;
  result := inttostr(ver) + '.' + inttostr(maj) + '.' + inttostr(min) + '.' + inttostr(bld);
end;

function s2n(s: TinlStringType): TinlNameType;
begin
  result := s;
end;

function b2s(b: TinlLogicType): TinlStringType;
begin
  if b then result := sTrue else result := sFalse;
end;

function i2s(i: TinlIntegerType): TinlStringType;
begin
  result := IntToStr(i);
end;

function h2s(i: TinlIntegerType): TinlStringType;
begin
  result := IntToHex(i,4);
end;

function r2s(r: TinlFloatType): TinlStringType;
begin
  result := FloatToStr(r);
end;

function i2b(i: TinlIntegerType): TinlLogicType;
begin
  result := i<>0;
end;

function r2b(r: TinlFloatType): TinlLogicType;
begin
  result := r<>0;
end;

function s2b(s: TinlStringType): TinlLogicType;
begin
  result := (s='1')or(s=sTrue)or(s=sOn)or(s=sYes)or(s=sEnabled);
end;

function int2idx(i: TinlIntegerType): TinlID; inline;
begin
  if i>0 then result := i
  else result := 0;
end;

function vldName(n: TinlNameType): TinlLogicType;
var
  i: integer;
begin
  result := false;
  i := length(n);
  while i>0 do
    if n[i] in TinlNameRestrChars then exit else dec(i);
  result := true;
end;

end.

